Как правильно писать спецификацию
Хождение по воде и разработка по спецификации легки, если и обе заморожены
Эдвард В. Берард
С самого начала моей карьеры, спецификация была больной темой. В маленькой веб-студии написание «спеки» сводилось в лучшем случае к двум-страничкам A4 с описанием нового модуля для уже работающей CMSки. Со временем я повидал и спеки как на 80 страниц от сторонних компаний в фиксированном pdf виде, так и в режиме постоянного scrumа где спека размазана по десяткам задачам в issue tracker'е.
Есть разница между спецификацией (SRS, техническим заданием), документацией и руководству по техническому обслуживанию, она в цели.
Цель спецификации зависит от фазы развития проекта:
- объяснить всем цель, причины, ограничения, scope и ожидания
- закрепить требования для этой фазы разработки
- получить оценку по времени, сложности, доступности ресурсов
- синхронизировать терминологию, поддерживать единую точку зрения для всех разработчиков
- под конец реализации, спецификация превращается в документацию — в базу знаний, карту по продукту
- автоматизировать тесты всех уровней
- запустить в оборот дальнейшие документы -user guide, release notes, white paper, интерактивную помощь, статьи в блоге
- подготовить tech manual для ремонта или интеграции системы
Scope — это треугольник ограничивающий ожидания всех сторон и напрямую влияющий на цену и деньги:
- Функциональность (сумма всех фич)
- Время выполнения
- Качество и детальность проработки
Без спецификации и чёткой черты ожиданий функиональности возникнут конфликты. С размытыми ожиданиями заказчик может добавлять в scope всё новые и новые задачи, либо ожидать нереалистично быстрых сроков, либо ожидать другое качество работы по производительности, поддержке устройств или языков.
Работая без спецификации, разработчики постоянно будут сталкиваться с новыми, ранее неизвестными требованиями. Это создаёт угнетающую атмосферу отсутствия прогресса, шаткости всего решения, страха переписывания всего проекта из-за какой-то важной мелочи. Потратив день на продумывание спецификации, можно точней сделать оценку трудозатрат (estimation), сузить конус неопределённости и снизить расходы
Содержание
Спецификация касается только фич, а не задач типа Improvement или Bug. Bug это несоответствие реализации и спеки. Improvement должен включать изменение спецификации на фазе release или code review.
Типы фич
Фичи в свою очередь различаются по глубине и влиянию на продукт. Спецификация для них фокусируется на разных пунктах и средствах донесения информации
- UI компонент (frontend). Например popup, tooltip, модальное окно, календарь, autocomplete, slider картинок
- Локальные бизнес-фичи (frontend + backend). Функционал свойственный именно этому продукту и завязанный на поведение пользователя. Например загрузка аватарок, изменение статьи, генерация excel-report'а.
- Глобальные архитектурные фичи (frontend + backend). Например навигация, переводы, error pages, permissions, email notifications. Завязаны на бизнес-фичи и инфраструктуру.
- Инфраструктурные, скрытые фичи (backend). Например мониторинг, логи, транзактивность, масштабирование серверов, асинхронные очереди, API reference
Стиль и язык
Спецификацию должен писать один автор, по возможности получая обратную связь от комманды. Это придаст спецификации однородный стиль и единую терминологию.
-
Простота. Используйте минимум иностранных фраз, сленга и аббревиатур. Используйте односложные предложения.
-
Понятность. Выносите упоминания протоколов, кодировок, расширений в сноски или прячьте эти детали. Приводите пример расчётов
-
Неполнота. Требования не должна досконально описывать всё решение
-
Согласованность. Требования не должны противоречить друг другу
-
Точность и проверяемость. Избегайте:
-
обобщений (every, all, everywhere, never, any, each)
-
бесконечных глаголов (minimize, maximize, optimize, improve)
-
неточных глаголов (support, handle)
-
неточных прилагательных (easy, simple, efficient, flexible, user-friendly, superior, seamless, graceful)
-
неисчислимые (few, several, many, some)
-
«догадайся сам» (etc. и … , including but not limited to, where appropriate, if necessary, adequate, reasonable, sufficient, optionally)
-
латынь — etc., e.g., i.e., ergo
-
Однозначность.
-
Избегайте двусмысленных выражений (это, который) в сложносочинённых предложениях. Например, что значит "мама / папа "? Правильно — "мама, папа или оба".
-
Одна сущность - один термин, одна операция - один глагол. Минимум об общений ( "Все варианты", "во всех местах", "Каку продукта Y" )
Версионируйте спецификацию с датами и авторами изменений. Указывайте к какой версии приложения она относится или с какой ветки она актуальна. Лучше всего документацию хранить внутри git вместе с кодом
Joel Spolsky советует разбавлять спеку крупинками юмора, что-бы она не была слишком сухой и трудночитаемой
Уровни обязательности
Некоторые спеки градируют приоритеты языком, указывая какие фичи обязательны а какие не очень:
- MUST или MUST NOT, REQUIRED, SHALL - строго обязательный функционал
- SHOULD или SHOULD NOT, RECOMMENDED - желательный функционал, но надо взвесить недостатки
- MAY, OPTIONAL - реализуется по возможности